Composite Key হলো একটি ডেটাবেস টেবিলের জন্য একাধিক কলামের সমন্বয়ে তৈরি প্রাইমারি কী (Primary Key)। এটি তখন ব্যবহার করা হয় যখন একটি মাত্র কলাম প্রাইমারি কী হিসেবে যথেষ্ট নয়। স্প্রিং ORM-এ JPA (Java Persistence API) ব্যবহার করে সহজেই Composite Keys পরিচালনা করা যায়।
import jakarta.persistence.Embeddable;
import java.io.Serializable;
@Embeddable
public class EmployeeId implements Serializable {
private int departmentId;
private int employeeNumber;
// Default Constructor
public EmployeeId() {}
// Parameterized Constructor
public EmployeeId(int departmentId, int employeeNumber) {
this.departmentId = departmentId;
this.employeeNumber = employeeNumber;
}
// Getters and Setters
public int getDepartmentId() {
return departmentId;
}
public void setDepartmentId(int departmentId) {
this.departmentId = departmentId;
}
public int getEmployeeNumber() {
return employeeNumber;
}
public void setEmployeeNumber(int employeeNumber) {
this.employeeNumber = employeeNumber;
}
// Override equals() and hashCode() methods
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
EmployeeId that = (EmployeeId) o;
return departmentId == that.departmentId && employeeNumber == that.employeeNumber;
}
@Override
public int hashCode() {
return Objects.hash(departmentId, employeeNumber);
}
}
ব্যাখ্যা:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.IdClass;
@Entity
@IdClass(EmployeeId.class)
public class Employee {
@Id
private int departmentId;
@Id
private int employeeNumber;
private String name;
private String position;
// Default Constructor
public Employee() {}
// Parameterized Constructor
public Employee(int departmentId, int employeeNumber, String name, String position) {
this.departmentId = departmentId;
this.employeeNumber = employeeNumber;
this.name = name;
this.position = position;
}
// Getters and Setters
public int getDepartmentId() {
return departmentId;
}
public void setDepartmentId(int departmentId) {
this.departmentId = departmentId;
}
public int getEmployeeNumber() {
return employeeNumber;
}
public void setEmployeeNumber(int employeeNumber) {
this.employeeNumber = employeeNumber;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
}
ব্যাখ্যা:
Employee
টেবিলের প্রাইমারি কী EmployeeId ক্লাসের সাথে ম্যাপ করা হয়েছে।import org.springframework.data.jpa.repository.JpaRepository;
public interface EmployeeRepository extends JpaRepository<Employee, EmployeeId> {
}
ব্যাখ্যা:
EmployeeId
কে Key Type হিসেবে ব্যবহার করা হয়েছে।import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public void saveEmployee(Employee employee) {
employeeRepository.save(employee);
}
public Employee getEmployeeById(EmployeeId employeeId) {
return employeeRepository.findById(employeeId).orElse(null);
}
}
ব্যাখ্যা:
EmployeeId employeeId = new EmployeeId(1, 101);
Employee employee = new Employee(1, 101, "John Doe", "Developer");
employeeService.saveEmployee(employee);
EmployeeId employeeId = new EmployeeId(1, 101);
Employee employee = employeeService.getEmployeeById(employeeId);
System.out.println("Employee Name: " + employee.getName());
Read more